import java.util.*;

public class Day43 {

    public static void main1(String[] args) {
        // 思路：最简单的方式，维护一个哈希表
        char[] alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        char[] nums = "22233344455566677778889999".toCharArray();
        HashMap<Character,Character> map = new HashMap<>();
        for (int i = 0; i < alphabets.length; i++) {
            map.put(alphabets[i],nums[i]);
        }

        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            in.nextLine(); // 吃空格
            // 用于报存结果的 set
            Set<String> res = new HashSet<>();
            for (int i = 0; i < n; i++) {
                char[] src = in.nextLine().toCharArray();
                // 用于报存当前子结果
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < src.length; j++) {
                    if (src[j] != '-') {
                        if (src[j] >= '0' && src[j] <= '9') {
                            sb.append(src[j]);
                        } else {
                            sb.append(map.get(src[j]));
                        }
                        if (sb.length() == 3) {
                            sb.append('-');
                        }
                    }
                }
                res.add(sb.toString());
            }
            // 按字典排序并打印结果(或者上面使用treeSet)
            List<String> list = new ArrayList<>(res);
            Collections.sort(list);
            for (String str : list) {
                System.out.println(str);
            }
            System.out.println();
        }
    }

    // 求和（此题递归求和--》用来训练递归是一个不错的选择）
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int m = in.nextInt();
            // 用来保存每次的结果
            List<Integer> res = new ArrayList<>();
            getNum(res,1,n,0,m);
        }
    }

    /**
     * 递归求结果
     * @param res 结果子集
     * @param pos 当前加数
     * @param n 最大加数
     * @param curSum 当前和
     * @param m 目标和
     */
    private static void getNum(List<Integer> res, int pos, int n, int curSum, int m) {
        // 递归终止条件
        if (curSum >= m) {
            if (curSum == m) {
                // 求和成功
                for (int i = 0; i < res.size() - 1; i++) {
                    System.out.print(res.get(i) + " ");
                }
                System.out.println(res.get(res.size() - 1));
            }
            return;
        }
        for (int i = pos; i <= n; i++) {
            // 保存当前数据
            res.add(i);
            getNum(res,i+1,n,curSum+i,m);
            // 尝试累加其他数据，删除当前数据
            res.remove(res.size()-1);
        }
    }
}
